package entity;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

/**
 * Adesione ad un annuncio, cioè associazione tra un annuncio e un suo iscritto
 * @author ale
 */
@Entity
public class Adesione implements Serializable {  
    
    /**
     * Satto dell'adesione a un annuncio (accettata, rifiutata, in sospeso, di default in sospeso)
     */
    public enum StatoAdesione {

        /**
         * L'adesione è stata accettata dal creatore dell'annuncio
         */
        ACCETTATA,
        /**
         * L'adesione è stata rifuitata dal creatore dell'annuncio (o perché l'annuncio è scaduto quando l'adesione era ancora in sospeso)
         */
        RIFIUTATA,
        /**
         * L'adesione non è ancora stata valutata dal creatore dell'annuncio
         */
        IN_SOSPESO
    }
    
    /**
     * Annuncio a cui l'adesione si riferisce
     */
    @ManyToOne
    private Annuncio annuncio;
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    /**
     * Lista degli articoli che l'iscritto indente acquistare
     */
    @OneToMany
    protected List<Articolo> articoli;    
    /**
     * Utente iscritto all'annuncio
     */
    @ManyToOne
    protected UtenteRegistrato iscritto;
    /**
     * Stato dell'adesione (in sospeso, accettata, rifiutata)
     */
    protected StatoAdesione stato;
    /**
     * true sse l'iscritto ha già lasciato il proprio feedback al creatore
     */
    boolean lasciatoFeedbackPerCreatore = false;
    /**
     * true se il creatore ha già lasciato il proprio feedback all'iscritto
     */
    protected boolean lasciatoFeedbackPerIscritto = false;
    /**
     * true sse l'iscritto ha già pagato i propri articoli al creatore
     */
    protected boolean pagata = false;

    /**
     * Calcola la spesa totale per gli articoli in questa adesione
     * @return la spesa totale per gli articoli in questa adesione
     */
    public float getSpesaArticoli(){
        float res = 0;
        
        for (Articolo art: getArticoli()){
            if (art.getStato() == Articolo.Stato.ACCETTATO){
                res += art.getPrezzo();
            }
        }
        
        return res;
    }
    
    /**
     * Get the value of pagata
     *
     * @return the value of pagata
     */
    public boolean isPagata() {
        return pagata;
    }

    /**
     * Set the value of pagata
     *
     * @param pagata new value of pagata
     */
    public void setPagata(boolean pagata) {
        this.pagata = pagata;
    }

    /**
     * Get the value of lasciatoFeedbackPerIscritto
     *
     * @return the value of lasciatoFeedbackPerIscritto
     */
    public boolean isLasciatoFeedbackPerIscritto() {
        return lasciatoFeedbackPerIscritto;
    }

    /**
     * Set the value of lasciatoFeedbackPerIscritto
     *
     * @param lasciatoFeedbackPerIscritto new value of lasciatoFeedbackPerIscritto
     */
    public void setLasciatoFeedbackPerIscritto(boolean lasciatoFeedbackPerIscritto) {
        this.lasciatoFeedbackPerIscritto = lasciatoFeedbackPerIscritto;
    }

    /**
     * Verifica se l'iscritto ha lasciato il proprio feedback al creatore
     * @return true sse l'iscritto ha lasciato il proprio feedback al creatore
     */
    public boolean isLasciatoFeedbackPerCreatore() {
        return lasciatoFeedbackPerCreatore;
    }

    /**
     * Definisce se l'iscritto ha lasciato il proprio feedback al creatore
     * @param lasciatoFeedback true sse l'iscritto ha lasciato il proprio feedback al creatore
     */
    public void setLasciatoFeedbackPerCreatore(boolean lasciatoFeedback) {
        this.lasciatoFeedbackPerCreatore = lasciatoFeedback;
    }

    /**
     * Get the value of stato
     *
     * @return the value of stato
     */
    public StatoAdesione getStato() {
        return stato;
    }

    /**
     * Set the value of stato
     *
     * @param stato new value of stato
     */
    public void setStato(StatoAdesione stato) {
        this.stato = stato;
    }
 
    /**
     * Recupera l'annuncio a cui l'adesione si riferisce
     * @return l'annuncio a cui l'adesione si riferisce
     */
    public Annuncio getAnnuncio() {
        return annuncio;
    }

    /**
     * Imposta a quale annuncio l'adesione si riferisce
     * @param annuncio l'annuncio a cui l'adesione si riferisce
     */
    public void setAnnuncio(Annuncio annuncio) {
        this.annuncio = annuncio;
    }

    /**
     * Get the value of articoli
     *
     * @return the value of articoli
     */
    public List<Articolo> getArticoli() {
        return articoli;
    }

    /**
     * Set the value of articoli
     *
     * @param articoli new value of articoli
     */
    public void setArticoli(List<Articolo> articoli) {
        this.articoli = articoli;
    }
    
    /**
     * Get the value of iscritto
     *
     * @return the value of iscritto
     */
    public UtenteRegistrato getIscritto() {
        return iscritto;
    }

    /**
     * Set the value of iscritto
     *
     * @param iscritto new value of iscritto
     */
    public void setIscritto(UtenteRegistrato iscritto) {
        this.iscritto = iscritto;
    }

    /**
     * Recupera l'id dell'adesione
     * @return l'id dell'adesione
     */
    public Long getId() {
        return id;
    }

    /**
     * Imposta l'id dell'adesione
     * @param id l'id dell'adesione
     */
    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Adesione)) {
            return false;
        }
        Adesione other = (Adesione) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entity.Adesione[ id=" + id + " ]";
    }
    
}
